#pragma once
#include <iostream>
#include <pthread.h>
#include <functional>
#include <cstring>
#include <string.h>
#include<unistd.h>
#include<vector>
namespace  PthreadModlue
{
    using func_t = std::function<void()>; // func_t是一个返回值为void 函数类型
    static int pthreadnum = 0;
    class Pthread
    {

    public:
        Pthread(func_t func) : _isdetach(false), _isrunning(false), res(nullptr), _func(func)
        {
            pthreadnum++;
            _name = "pthread-" + std::to_string(pthreadnum);
        }
        ~Pthread() {}
        static void *rountinue(void *args)
        {
            Pthread *ret = static_cast<Pthread *>(args);
            ret->_func();
            ret->_isrunning=false;
            pthread_setname_np(ret->_tid,ret->_name.c_str());
            return ret;
        }
        bool Start()
        {
            if (_isrunning)
                return false;
                _isrunning=true;
            int n = pthread_create(&_tid, nullptr, rountinue, this); // 这里传入this指针
            // 为了方便我们调用类内的我们要执行的函数
            if (n != 0)
            {
                std::cerr << "create thread error: " << strerror(n) << std::endl;
                return false;
            }
            else
            {
                std::cout << _name << " create success" << std::endl;
                return true;
            }
        }
        bool Stop()
        {
            // 停止一个线程要判断他是不是可分离的
            if (_isrunning)
            {
                _isrunning=false;
                int n = pthread_cancel(_tid);
                if (n == 0)
                {
                    std::cout << _name << "stop success!!!" << std::endl;
                    return true;
                }
                else
                {
                    std::cerr << strerror(n) << std::endl;
                }
            }
            return false;
        }
        void Dedath()
        {
            if (_isdetach)
                return;
            if (_isrunning)
            {
                // 运行时我们要进行直接分离
                pthread_detach(_tid);
                EnableDertach();
            }
            // 走到这说明该线程该没运行
            // 此时我们只需要改标志位就好了
            // 之后在join函数判断该标志为就好了
            EnableDertach();
        }
        bool Join()
        {
            if (_isdetach)
            {
                std::cerr << _name<<" " << "alread is detached!!!" << std::endl;
                return false;
            }
            void *ans = nullptr;
            int n = pthread_join(_tid, &ans);
            if (n == 0)
            {
                std::cout << _name <<" "<< "join success!!!" << std::endl;
                return true;
            }
            else 
            {
                std::cout << _name <<" "<< "join failure!!!" << std::endl;
                std::cout<<strerror(n)<<std::endl;
                return false;
            }
        }

    private:
        void EnableDertach()
        {
            std::cout << "pthread is seted joibable!!!" << std::endl;
            _isdetach = true;
        }
        void EnableRunning()
        {
            if (!_isrunning)
                _isrunning = true;
        }

    private:
        pthread_t _tid;    // 线程id
        std::string _name; // 线程名字
        bool _isdetach;    // 是否可分离
        bool _isrunning;   // 是否运行
        void *res;         // 现返回值写入
        func_t _func;      // 现场执行的函数
    };
}
